//
// server.hpp
// ~~~~~~~~~~
//

#ifndef HTTP_SERVER_SERVER_HPP
#define HTTP_SERVER_SERVER_HPP

#include <boost/asio.hpp>
#include <string>
#include "base/io_context_pool.hpp"
#include "request_handler.hpp"

namespace http {
namespace server {

    //std::string doc_root;
    /// The top-level class of the HTTP server.
    class server
    {
    public:
      server(const server&) = delete;
      server& operator=(const server&) = delete;

      /// Construct the server to listen on the specified TCP address and port, and
      /// serve up files from the given directory.
      explicit server(const std::string& address, const std::string& port,
          const std::string& doc_root, std::size_t io_context_pool_size);

      /// Run the server's io_context loop.
      void run();

    private:
      /// Perform an asynchronous accept operation.
      void do_accept();

      /// Wait for a request to stop the server.
      void do_await_stop();

      /// The pool of io_context objects used to perform asynchronous operations.
      io_context_pool io_context_pool_;

      /// The signal_set is used to register for process termination notifications.
      boost::asio::signal_set signals_;

      /// Acceptor used to listen for incoming connections.
      boost::asio::ip::tcp::acceptor acceptor_;

      /// The handler for all incoming requests.
      request_handler request_handler_;
    };

} // namespace server
} // namespace http

#endif // HTTP_SERVER_SERVER_HPP
